package arithmetic.LeetCode;

/**
 * @author jiangfeng 2019/8/18 23:01
 * 算摇摆子序列，https://leetcode-cn.com/problems/wiggle-subsequence/submissions/
 * 用状态机。
 *
 */
public class wiggleSubsequence {

    /**
     * 思路： 用状态机 三个状态：  开始 ，上升 ，下降状态
     *    开始： 起始时时开始状态，如果下个元素相等则仍是开始状态。
     *       -》开始： 相等
     *       -》下降： 大于   maxLength++
     *       -》上升： 小于   maxLength++
     *    下降：
     *       -》上升： 小于  maxLength++
     *       -》下降： 等于或大于
     *     上升：
     *       -》下降：大于   maxLength++
     *       -》上升： 等于或小于
     *
     * @param nums
     * @return
     */
    public int wiggleMaxLength(int[] nums) {
        if(nums.length<=1) return nums.length;
        int maxLengh=1, i =1;
        boolean isUp = true;
        while(i<nums.length){  // begin
            if(nums[i]!=nums[i-1]){
                isUp=nums[i]>nums[i-1];
                maxLengh++;
                break;
            }
            i++;
        }
        while(i<nums.length){
            if(nums[i] < nums[i-1] && isUp){
                isUp=false;
                maxLengh++;
            }else if(nums[i] > nums[i-1] && !isUp){
                isUp=true;
                maxLengh++;
            }
            i++;
        }
        return maxLengh;
    }
}
